; int sumatoriaCruz(int fila, int columna)

extern screen_pixeles

; constantes globales
	%include "constantes.mac"

; parametros

	%define fila					[ebp + 8]
	%define columna					[ebp + 12]

; variables locales

	%define up						[ebp - 4]
	%define down					[ebp - 8]
	%define left					[ebp - 12]
	%define right					[ebp - 16]

	%define color					[ebp - 20]
	%define ancho_pantalla_bytes	[ebp - 24]
	%define ptr_matriz				[ebp - 28]
	%define suma_RGB				[ebp - 32]

	%define bytes_reservados	 	32
	%define mascara_pixel 			0x000000FF

global sumatoriaCruz

section .text

sumatoriaCruz:

	push ebp			; creo el marco de la pila
	mov ebp, esp		; creo el marco de la pila

	sub esp, bytes_reservados	; reservo memoria en la pila

	push ebx			; salvo registros convencion C
	push edi			; salvo registros convencion C
	push esi			; salvo registros convencion C

	mov dword suma_RGB, 0
	mov dword color, 0

busco_pixel:

	mov esi, dword fila				; esi = fila
	mov edi, dword columna			; edi = columna

	mov eax, dword bytes_por_pixel	; eax = 3
	mov ebx, dword ancho_pantalla	; ebx = ancho_pantalla
	mul ebx							; eax = 3 * ancho_pantalla

	mov dword ancho_pantalla_bytes, eax

	mul esi							; eax = ancho_pantalla_bytes * fila
	mov esi, eax					; esi = desplazamiento fila

	mov eax, dword bytes_por_pixel	; eax = 3
	mul edi							; eax = 3 * columna
	mov edi, eax					; edi = desplazamiento columna

	xor eax, eax					; eax = 0
	add eax, dword esi				; eax += offset fila
	add eax, dword edi				; eax += offset columna
	add eax, dword color			; eax += color que corresponda

	mov dword ptr_matriz, eax		; ptr_matriz = offset (i,j)

	mov esi, dword fila
	mov edi, dword columna

inicializo_variables:

	mov dword up, 0
	mov dword down, 0
	mov dword left, 0
	mov dword right, 0

pixel_up:

	cmp esi, 0
	je pixel_down

	mov edx, [screen_pixeles]			; BASE
	add edx, dword ptr_matriz			; DESPLAZAMIENTO
	sub edx, dword ancho_pantalla_bytes	; DESPLAZAMIENTO

	mov ecx, dword [edx]
	and ecx, dword mascara_pixel
	add dword up, ecx

pixel_down:

	mov ecx, dword alto_pantalla
	dec ecx
	cmp esi, ecx
	jge pixel_left

	mov edx, [screen_pixeles]			; BASE
	add edx, dword ptr_matriz			; DESPLAZAMIENTO
	add edx, dword ancho_pantalla_bytes	; DESPLAZAMIENTO

	mov ecx, dword [edx]
	and ecx, dword mascara_pixel
	add dword down, ecx

pixel_left:

	cmp edi, 0
	je pixel_right

	mov edx, [screen_pixeles]		; BASE
	add edx, dword ptr_matriz		; DESPLAZAMIENTO
	sub edx, dword bytes_por_pixel	; DESPLAZAMIENTO

	mov ecx, dword [edx]
	and ecx, dword mascara_pixel
	add dword left, ecx

pixel_right:

	mov ecx, dword ancho_pantalla
	dec ecx
	cmp edi, ecx

	mov edx, [screen_pixeles]		; BASE
	add edx, dword ptr_matriz		; DESPLAZAMIENTO
	add edx, dword bytes_por_pixel	; DESPLAZAMIENTO

	mov ecx, dword [edx]
	and ecx, dword mascara_pixel
	add dword right, ecx

suma_cruz:	

	xor eax, eax				; eax = sumatoria

	add eax, dword up			; eax += up
	add eax, dword down			; eax += down
	add eax, dword left			; eax += left
	add eax, dword right		; eax += right

	add dword suma_RGB, eax
	shr eax, 2					; sumatoria / 4

a_pantalla:

	mov edx, [screen_pixeles]			; BASE
	add edx, dword ptr_matriz
	mov [edx], ax

siguienteColor:

	inc dword color
	cmp dword color, 3
	je fin
	jmp busco_pixel

fin:

	mov eax, suma_RGB

	pop esi						; desarmo el stack frame
	pop edi						; desarmo el stack frame
	pop ebx						; desarmo el stack frame
	add esp, bytes_reservados	; desarmo el stack frame
	pop ebp						; desarmo el stack frame

	ret
